package gui;

import actions.ResetAction;
import actions.SliderChangeListener;
import actions.StartAction;
import actions.PauzeAction;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JSlider;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import logica.Constanten;
import logica.Zee;

/**
 * De klasse Venster is afgeleid van JFrame en stelt bijgevolg het venster voor.
 * Hier worden de verschillende panelen tot één geheel gevormd.
 *
 * @author Bart Bruynooghe
 * @author Benjamin De Clercq
 * @author Thomas Flamant
 * @author Sander Van den Broecke
 * @see JFrame
 */
public class Venster extends JFrame {

	private Zee mijnZee;
	private JZee mijnJZee;
	private StartAction startAction;
	private PauzeAction pauzeAction;
	private ResetAction resetAction;
	private JSlider slider;
	private int snelheid = 0;

	/**
	 * De constructor zorgt dat het venster wordt ingesteld met de juiste eigenschappen.
	 * <p>
	 * Eveneens wordt er een menuBar en toolBar voorzien.
	 */
	public Venster(String titel) {
		super(titel);
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		startAction = new StartAction(this);
		pauzeAction = new PauzeAction(this);
		resetAction = new ResetAction(this);

		setLayout(new BorderLayout());

		createMenuBar();
		createToolBar();
		createZee();

		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}

	private void createZee() {
		mijnZee = new Zee();
		mijnJZee = new JZee(mijnZee);
		mijnZee.setView(mijnJZee);
		add(mijnJZee, BorderLayout.CENTER);

	}

	private void createMenuBar() {
		JMenuBar menuBar = new JMenuBar();

		//Navigatie
		JMenu mNavigatie = new JMenu("Navigatie");
		mNavigatie.setMnemonic(KeyEvent.VK_N);

		JMenuItem miTrager = new JMenuItem("Trager");
		miTrager.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, InputEvent.CTRL_MASK));
		miTrager.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				if (snelheid > Constanten.MINSCHAALTIMER) {
					snelheid--;
					getZee().setSnelheidTimer(snelheid);
					slider.setValue(snelheid);
				}
			}
		});

		JMenuItem miNormaal = new JMenuItem("Normale snelheid");
		miNormaal.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, InputEvent.CTRL_MASK));
		miNormaal.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				snelheid = 0;
				getZee().setSnelheidTimer(0);
				slider.setValue(0);
			}
		});

		JMenuItem miSneller = new JMenuItem("Sneller");
		miSneller.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, InputEvent.CTRL_MASK));
		miSneller.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				if (snelheid < Constanten.MAXSCHAALTIMER) {
					snelheid++;
					getZee().setSnelheidTimer(snelheid);
					slider.setValue(snelheid);
				}
			}
		});


		JMenuItem miAfsluiten = new JMenuItem("Afsluiten");
		miAfsluiten.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
		miAfsluiten.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});

		mNavigatie.add(startAction);
		mNavigatie.add(pauzeAction);
		mNavigatie.addSeparator();
		mNavigatie.add(resetAction);
		mNavigatie.addSeparator();
		mNavigatie.add(miTrager);
		mNavigatie.add(miNormaal);
		mNavigatie.add(miSneller);
		mNavigatie.addSeparator();
		mNavigatie.add(miAfsluiten);

		//Extra
		JMenu mExtra = new JMenu("Extra");
		mExtra.setMnemonic(KeyEvent.VK_E);
		JMenuItem miOpties = new JMenuItem("Opties");
		miOpties.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
		final Venster ouder = this;
		miOpties.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				new OptieDialog(ouder);
			}
		});
		mExtra.add(miOpties);

		//Help
		JMenu mHelp = new JMenu("Help");
		mHelp.setMnemonic(KeyEvent.VK_H);
		JMenuItem miHandleiding = new JMenuItem("Handleiding");
		miHandleiding.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F11, InputEvent.CTRL_MASK));
		miHandleiding.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				//TODO open handleiding
			}
		});
		mHelp.add(miHandleiding);

		//Knoppen toevoegen aan menuBar
		menuBar.add(mNavigatie);
		menuBar.add(mExtra);
		menuBar.add(mHelp);
		setJMenuBar(menuBar);
	}

	private void createToolBar() {
		// ToolBar
		JToolBar toolBar = new JToolBar();

		//Toolbar - Slider snelheid
		slider = new JSlider(Constanten.MINSCHAALTIMER, Constanten.MAXSCHAALTIMER);
		slider.setMinimum(Constanten.MINSCHAALTIMER);
		slider.setMaximum(Constanten.MAXSCHAALTIMER);
		slider.setMajorTickSpacing(1);
		slider.setPaintTicks(true);
		slider.addChangeListener(new SliderChangeListener(this));

		// knoppen toevoegen aan de toolBar
		toolBar.add(startAction);
		toolBar.add(pauzeAction);
		toolBar.add(resetAction);
		toolBar.add(Box.createHorizontalGlue());
		toolBar.add(slider);
		add(toolBar, BorderLayout.NORTH);
		toolBar.setFloatable(false);
	}

	/**
	 * Deze methode is een getter en geeft het attribuut mijnZee terug
	 * @return Zee geeft mijnZee terug
	 */
	public Zee getZee() {
		return mijnZee;
	}

	/**
	 * Deze methode reset de applicatie
	 * Er wordt een nieuwe Zee aangemaakt, maar de instellingen (snelheid)
	 * blijven wel bewaard
	 */
	public void reset() {
		mijnZee = new Zee();
		mijnZee.setView(mijnJZee);
		mijnJZee.setZee(mijnZee);
		mijnZee.setSnelheidTimer(slider.getValue());
	}

	public PauzeAction getPauzeAction() {
		return pauzeAction;
	}

	public StartAction getStartAction() {
		return startAction;
	}
}
